snapshot: Implement gtk_snapshot_push_opacity()
authorBenjamin Otte <otte@redhat.com>
Sat, 17 Dec 2016 07:06:59 +0000 (08:06 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:11 +0000 (18:01 +0100)
Use it in GtkWidget's opacity handling.

gtk/gtksnapshot.c
gtk/gtksnapshot.h
gtk/gtkwidget.c

index dfcd3f3ac7f83060f4f6d94349517c088d77d693..e977e4af9f26bf567766d9fb7edcaadc0c42ac8e 100644 (file)
@@ -275,6 +275,58 @@ gtk_snapshot_push_transform (GtkSnapshot             *snapshot,
                                             real_transform);
 }
 
+static GskRenderNode *
+gtk_snapshot_collect_opacity (GskRenderNode **nodes,
+                              guint           n_nodes,
+                              const char     *name,
+                              gpointer        opacity)
+{
+  GskRenderNode *node, *opacity_node;
+
+  node = gtk_snapshot_collect_default (nodes, n_nodes, name, NULL);
+  if (node == NULL)
+    return NULL;
+
+  opacity_node = gsk_opacity_node_new (node, *(double *) opacity);
+  gsk_render_node_set_name (opacity_node, name);
+
+  gsk_render_node_unref (node);
+  g_free (opacity);
+
+  return opacity_node;
+}
+
+void
+gtk_snapshot_push_opacity (GtkSnapshot *snapshot,
+                           double       opacity,
+                           const char  *name,
+                           ...)
+{
+  double *real_opacity;
+  char *str;
+
+  if (name)
+    {
+      va_list args;
+
+      va_start (args, name);
+      str = g_strdup_vprintf (name, args);
+      va_end (args);
+    }
+  else
+    str = NULL;
+
+  real_opacity = g_memdup (&opacity, sizeof (gdouble));
+
+  snapshot->state = gtk_snapshot_state_new (snapshot->state,
+                                            str,
+                                            snapshot->state->clip_region,
+                                            snapshot->state->translate_x,
+                                            snapshot->state->translate_y,
+                                            gtk_snapshot_collect_opacity,
+                                            real_opacity);
+}
+
 static void
 rectangle_init_from_graphene (cairo_rectangle_int_t *cairo,
                               const graphene_rect_t *graphene)
index ea9c578ad38b88fcd8c8f5869d6b9b6ec6809784..c5c2d20b3da0c191c16b1a0f734b07fe8bc6cf5a 100644 (file)
@@ -47,6 +47,11 @@ void            gtk_snapshot_push_transform             (GtkSnapshot
                                                          const char             *name,
                                                          ...) G_GNUC_PRINTF (3, 4);
 GDK_AVAILABLE_IN_3_90
+void            gtk_snapshot_push_opacity               (GtkSnapshot            *snapshot,
+                                                         double                  opacity,
+                                                         const char             *name,
+                                                         ...) G_GNUC_PRINTF (3, 4);
+GDK_AVAILABLE_IN_3_90
 void            gtk_snapshot_push_clip                  (GtkSnapshot            *snapshot,
                                                          const graphene_rect_t  *bounds,
                                                          const char             *name,
index 163f621a8ba5fade2acd1044f2b1a146d125d802..8c54364362a16ae268d1ca36bbcad2ec5d7c8d98 100644 (file)
@@ -15573,7 +15573,7 @@ gtk_widget_snapshot (GtkWidget   *widget,
   else
     {
       if (opacity < 1.0)
-        gtk_snapshot_push (snapshot, TRUE, "OpacityGroup<%s>", G_OBJECT_TYPE_NAME (widget));
+        gtk_snapshot_push_opacity (snapshot, opacity, "Opacity<%s,%f>", G_OBJECT_TYPE_NAME (widget), opacity);
 
       klass->snapshot (widget, snapshot);
 
@@ -15593,17 +15593,7 @@ gtk_widget_snapshot (GtkWidget   *widget,
         }
 
       if (opacity < 1.0)
-        {
-          GskRenderNode *opacity_node, *node;
-
-          node = gtk_snapshot_pop (snapshot);
-          opacity_node = gsk_opacity_node_new (node, opacity);
-          gsk_render_node_set_name (opacity_node, "Opacity");
-          gsk_render_node_unref (node);
-
-          gtk_snapshot_append_node (snapshot, opacity_node);
-          gsk_render_node_unref (opacity_node);
-        }
+        gtk_snapshot_pop_and_append (snapshot);
     }
 }